-- 2022-7-28

--[[
    如果想表示常见的数组或者列表，只需要使用整型作为索引的表即可，同时，也不需要声明表的大小，只需要直接初始化我们需要的元素即可

    Lua语言中，数组索引按照惯例是从1开始的，Lua语言中的其他很多机制也遵循这个惯例
    
    当操作列表时，我们往往必须先获取列表的长度
    列表的长度可以存放在常量中，也可以存放在其他变量或数据结构中
    我们把列表的长度保存在表中某个非数值的字段中,由于历史原因这个键通常是"n"
    当然列表的长度经常是隐式的
    由于未初始化的元素均为nil，所以可以用nil值来标记列表的结束
    当数据中不存在nil时，我们可以很容易知道列表的长度，这种技巧只有在列表不存在空洞hole时即所有元素均不为nil才有效，此时我们把这种所有元素都不为nil的数组称为序列
    Lua提供了获取序列长度的操作符#
        对于字符串而言，获取字符串的长度
        对于表而言，该操作符返回对应序列的长度
        几种有用的写法
        a[#a] = nil --> 移除最后一个值
        a[#a + 1] = v --> 把v加到序列最后
]]

a = {"1",nil,"2",nil}
print(#a)
b = {}
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 4
b[100] = nil
b [99] = nil
print(#b)
b[3] = nil
print(#b)

c = {}
c[1] = 1
c[1000] = 1
print(#c)

-- 在大多数情况下，使用长度操作符是安全的
-- 这么多测试之后，我们发现，在有空洞的序列中，使用长度操作符是不安全的，我们应该显示的把长度保存起来